//
//  WBNetWorkManager.swift
//  mySwiftVV
//
//  Created by hu yr on 2016/12/16.
//  Copyright © 2016年 terry. All rights reserved.
//

import UIKit
import AFNetworking

//Swift 的枚举支持任意数据类型
//switch / enum 在OC 中都只是支持整数
enum WBHTTPMethod{
    
    case GET
    case POST
}

///网络管理工具
class WBNetWorkManager: AFHTTPSessionManager {

    // 静态区 / 常量 / 闭包 /
    //在第一次访问时, 执行闭包, 并且将结果保存在 shared 常量中
    static let shared = { () -> WBNetWorkManager in 
       
        // 实例化对象
        let instance = WBNetWorkManager()
        
        //设置相应反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        //返回对象
        return instance
    }()
    
    /// 用户账户懒加载属性
    lazy var userAccount = WBUserAccount()
    
    /// 用户登录标记[计算型属性]
    var userLogon : Bool{
        return userAccount.access_token != nil
    }
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method : WBHTTPMethod = .GET, URLString : String, parameters : Any?, completion: @escaping (_ json: Any?,_ isSucess: Bool) -> () ){
        
        // 处理token 字典
        //0.判断token是否为nil,为nil直接返回
        guard let token = userAccount.access_token else {
            //发送通知,提示用户登录
            print("没有token, 需要登录")
            
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: nil)
            
            completion(nil,false)
            
            return
        }
        
        //1.判断 参数字典是否存在, 如果为nil,应该新建一个字典
        var parameter = parameters
        if parameter == nil {
            //实例化字典
            parameter = [String : AnyObject]()
        }
        
        //2 . 设置参数字典
        //access_token
        var str = parameter! as! [String : AnyObject]
        
        str["access_token"] = token as AnyObject?
        
        
        
        
        
        //调用request 发起真正的网络请求方法
         request(URLString: URLString, parameters: str, completion: completion)
        
        
    }
    
    //使用一个函数封装 AFN的 Get 和Post 请求
    /// 封装AFN的 get /post请求
    ///
    /// - Parameters:
    ///   - method: GET / POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典 / 数组), 是否成功]
    func request(method : WBHTTPMethod = .GET, URLString : String, parameters : Any?, completion: @escaping (_ json: Any?,_ isSucess: Bool) -> () ){
        
        let success = { (task: URLSessionDataTask, json: Any?) -> () in
            completion(json,true)
        }
        
        let failure = { (task: URLSessionDataTask?, error:Error) -> () in
           
            //针对403 处理用户 token 过期
            //对于测试用户,超过刷新量,token被锁定.需要重新创建一个程序
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token 过期了")
                
//                发送通知(本方法不知道被谁调用,谁接收到通知,谁处理)
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: "bad token")
                
            }
            
            //error  通常比较吓人,例如编号 : xxxxx,错误原因一堆英文
            print("网络请求错误 \(error)")
            
            completion(nil, false)
        }
        
        
        if method == .GET {
            
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else{
            
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
            
        }
        
        
    }
    
}
